package com.hzw.saas.common.util.enums;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.hzw.saas.common.util.exception.ConflictException;
import com.hzw.saas.common.util.exception.LostException;
import com.hzw.saas.common.util.exception.NotFoundException;

import java.util.Objects;

/**
 * 断言数据状态枚举
 *
 * @author zzl
 * @since 05/18/2021
 */
public enum AssertEnum {

    // 忽略
    IGNORE(null, ""),
    // 断言数据存在，如果不存在是输入错误，request error
    FOUND(true, "未找到"),
    // 断言数据存在，如果不存在是丢失异常，server error
    EXIST(true, "已丢失"),
    // 断言数据不存在
    NOT_FOUND(false, "已存在"),
    // 断言结果为true
    TRUE(true, "false"),
    // 断言结果为false
    FALSE(false, "true");

    AssertEnum(Boolean assertResult, String errorMsg) {
        this.assertResult = assertResult;
        this.errorMsg = errorMsg;
    }

    private final Boolean assertResult;

    private final String errorMsg;

    public Boolean result() {
        return assertResult;
    }

    public Boolean getAssertResult() {
        return assertResult;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    /**
     * @param assertEnum   断言结果
     * @param actualResult 实际结果
     * @param resultName   结果实体名称
     * @throws ConflictException 数据冲突
     * @throws NotFoundException 未找到，请求错误
     * @throws LostException     数据丢失，服务器端错误
     * @deprecated 请使用com.hzw.saas.common.config.util.AssertUtil
     */
    @Deprecated
    public static void assertResult(AssertEnum assertEnum, boolean actualResult, String resultName) throws ConflictException, NotFoundException, LostException {
        // 不进行断言
        if (ignore(assertEnum)) return;
        // 断言正确
        if (Objects.equals(assertEnum.assertResult, actualResult)) return;
        // 断言错误
        String errorMsg = StrUtil.concat(true, resultName, assertEnum.errorMsg);
        if (actualResult) {
            // data conflict (request error)
            throw new ConflictException(errorMsg);
        }
        if (Objects.equals(assertEnum, AssertEnum.EXIST)) {
            // data lost (server error)
            throw new LostException(errorMsg);
        } else {
            // data not found (request error)
            throw new NotFoundException(errorMsg);
        }
    }

    /**
     * @param assertEnum      断言结果
     * @param actualResultObj 实际结果，对象为空(null,string,Map,Iterable,Iterator,Array) = false
     * @param resultName      结果实体名称
     * @throws ConflictException 数据冲突
     * @throws NotFoundException 未找到，请求错误
     * @throws LostException     数据丢失，服务器端错误
     * @deprecated 请使用com.hzw.saas.common.config.util.AssertUtil
     */
    @Deprecated
    public static void assertResult(AssertEnum assertEnum, Object actualResultObj, String resultName) throws ConflictException, NotFoundException, LostException {
        if (ignore(assertEnum)) return;
        boolean actualResult = ObjectUtil.isNotEmpty(actualResultObj);
        assertResult(assertEnum, actualResult, resultName);
    }

    private static boolean ignore(AssertEnum assertEnum) {
        return Objects.isNull(assertEnum) || Objects.equals(assertEnum, AssertEnum.IGNORE);
    }
}
